package br.ufrn.cep.eEtica.integracao.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
@Entity
public class AreaConhecimento {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_AREA")
	@SequenceGenerator(name = "SEQ_AREA", sequenceName = "seq_area")
	private int id;

	private String area;
	
	private String descricao;
	
	@ManyToOne(optional = true, fetch = FetchType.LAZY)
	@JoinColumn(name = "area_conhecimento_pai_id")
	private AreaConhecimento areaConhecimentoPai;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "areaConhecimentoPai")
	private List<AreaConhecimento> subAreasConhecimento = new ArrayList<AreaConhecimento>();

	public AreaConhecimento() {
	}
	
	public AreaConhecimento(String area) {
		this.area = area;
	}
	
	@XmlAttribute
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@XmlElement
	public String getArea() {
		return area;
	}

	public void setArea(String area) {
		this.area = area;
	}

	@XmlElement
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@XmlElement
	public AreaConhecimento getAreaConhecimentoPai() {
		return areaConhecimentoPai;
	}

	public void setAreaConhecimentoPai(AreaConhecimento areaConhecimentoPai) {
		this.areaConhecimentoPai = areaConhecimentoPai;
	}

	@XmlTransient
	public List<AreaConhecimento> getSubAreasConhecimento() {
		return subAreasConhecimento;
	}

	public void setSubAreasConhecimento(List<AreaConhecimento> subAreasConhecimento) {
		this.subAreasConhecimento = subAreasConhecimento;
	}
	
	public void addSubAreaConhecimento(AreaConhecimento subAreaConhecimento) {
		this.subAreasConhecimento.add(subAreaConhecimento);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((area == null) ? 0 : area.hashCode());
		result = prime
				* result
				+ ((areaConhecimentoPai == null) ? 0 : areaConhecimentoPai
						.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + id;
		result = prime
				* result
				+ ((subAreasConhecimento == null) ? 0 : subAreasConhecimento
						.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AreaConhecimento other = (AreaConhecimento) obj;
		if (area == null) {
			if (other.area != null)
				return false;
		} else if (!area.equals(other.area))
			return false;
		if (areaConhecimentoPai == null) {
			if (other.areaConhecimentoPai != null)
				return false;
		} else if (!areaConhecimentoPai.equals(other.areaConhecimentoPai))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (id != other.id)
			return false;
		if (subAreasConhecimento == null) {
			if (other.subAreasConhecimento != null)
				return false;
		} else if (!subAreasConhecimento.equals(other.subAreasConhecimento))
			return false;
		return true;
	}

}
